home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BPC-DE10.ZIP / INITPORT.PAS < prev    next >
Pascal/Delphi Source File  |  1995-09-05  |  6KB  |  253 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Turbo Pascal Version 7.0                        }
  5. {       BBS Doors Support Unit                          }
  6. {                                                       }
  7. {       Copyright (c) 1995 by Solar Designer            }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit InitPort;
  12. {$G+}
  13. interface
  14. uses
  15.    Fossil, SendANSI,
  16.    BIOSKeys;
  17.  
  18. var
  19.    LocalMode       :Boolean;
  20.    Port            :TFossilPort;
  21.  
  22. const
  23.    VStr =          '1.0';
  24.  
  25.    CopyrightASCII  :PChar =
  26.    #13#10'Doors Engine  Version '+VStr+'  Copyright (c) 1995 by Solar Designer \ BPC'#13#10#13#10'$';
  27.  
  28.    CopyrightANSI =
  29.    #13#10#27'[0m'#27'[1mD'#27'[0moors '#27'[1mE'#27'[0mngine  '#27'[1mV'#27'[0mersion '+VStr+
  30.    '  '#27'[1mC'#27'[0mopyright (c) 1995 by '+
  31.    #27'[1m'#27'[33mS'#27'[37molar '#27'[33mD'#27'[37mesigner \ BPC'#27'[0m'#13#10;
  32.  
  33. const
  34.    TimeUsed        :LongInt= 0;
  35.    TimeLimit       :LongInt= 0;
  36.    TimeLeftMsg     :PChar =
  37.    ' Time left: 000 minutes ';
  38.  
  39. procedure Abort(Msg                    :PChar);
  40.  
  41. function  GetEvent                               :Word;
  42.  
  43. implementation
  44.  
  45. const
  46.    Keys            :Array [#1..#32] of Word = (
  47.    kbCtrlA, kbCtrlB, kbCtrlC, kbCtrlD, kbCtrlE, kbCtrlF, kbCtrlG, kbBack,
  48.    kbTab, kbCtrlEnter, kbCtrlK, kbCtrlL, kbEnter, kbCtrlN, kbCtrlO, kbCtrlP,
  49.    kbCtrlQ, kbCtrlR, kbCtrlS, kbCtrlT, kbCtrlU, kbCtrlV, kbCtrlW, kbCtrlX,
  50.    kbCtrlY, kbCtrlZ, kbEsc, 28, 29, 30, 31, kbSpace);
  51.  
  52.    ArrowKeys       :Array ['A'..'D'] of Word = (
  53.    kbUp, kbDown, kbRight, kbLeft);
  54.  
  55.    EscTime =       4;
  56.  
  57. procedure SendChar(c                   :Char); far;
  58. begin
  59.    Port.SendChar(c);
  60. end;
  61.  
  62. function  CD                                     :Boolean; far;
  63. begin
  64.    CD:=Port.CarrierDetect;
  65. end;
  66.  
  67. var
  68.    LastExitProc    :Pointer;
  69.  
  70. procedure PortExitProc; far;
  71. begin
  72.    if not LocalMode then
  73.    begin
  74.       DoneSendANSI; Port.Done;
  75.    end;
  76.    ExitProc:=LastExitProc;
  77. end;
  78.  
  79. function  GetEvent;
  80. label
  81.    LocalKey, W8Key;
  82. var
  83.    c               :Char;
  84.    Timer           :LongInt absolute 0:$46C;
  85.    W8Timer, W8i    :Byte;
  86.    Time            :Word;
  87. const
  88.    UpdateTimer     :LongInt= MaxLongInt;
  89. begin
  90.    if LocalMode then
  91.    asm
  92. LocalKey:
  93.       xor  ax,ax
  94.       int  16h
  95.       leave
  96.       ret
  97.    end;
  98.  
  99. W8Key:
  100.    if not Port.CarrierDetect then
  101.       Abort('Carrier lost'#13#10'$');
  102.    asm
  103.       mov  ah,1
  104.       int  16h
  105.       jnz  LocalKey
  106.    end;
  107.  
  108.    Time:=(TimeLimit-TimeUsed) div (6*182)+1;
  109.  
  110.    asm
  111.       mov  ax,Time
  112.       mov  cx,3
  113.       mov  si,word ptr TimeLeftMsg
  114. @@NextDigit:
  115.       cwd
  116.       mov  bx,10
  117.       div  bx
  118.       mov  bx,dx
  119.       or   bx,ax
  120.       jnz  @@Not0
  121.       mov  dl,' '
  122.       jmp  @@SaveDigit
  123. @@Not0:
  124.       add  dl,'0'
  125. @@SaveDigit:
  126.       mov  byte ptr [si+14],dl
  127.       dec  si
  128.       loop @@NextDigit
  129.  
  130.       les  di,ScreenAddr
  131.       imul bx,ScreenWidth,2*23
  132.       lea  di,[di+bx+2*2]
  133.       mov  si,word ptr TimeLeftMsg
  134.       mov  ah,0Fh
  135.       cld
  136. @@NextChar:
  137.       lodsb
  138.       or   al,al
  139.       jz   @@Done
  140.       stosw
  141.       jmp  @@NextChar
  142. @@Done:
  143.    end;
  144.  
  145.    if Timer<>UpdateTimer then UpdateSendANSI;
  146.    asm cli end;
  147.    if Timer>UpdateTimer then Inc(TimeUsed, Timer-UpdateTimer);
  148.    UpdateTimer:=Timer;
  149.    asm sti end;
  150.  
  151.    if TimeUsed>TimeLimit then
  152.    begin
  153.       DoneSendANSI;
  154.       Port.SendString('Time limit'#13#10);
  155.       Port.Done;
  156.       ExitProc:=LastExitProc;
  157.       Abort('Time limit'#13#10'$');
  158.    end;
  159.  
  160.    if Port.CharAvail then
  161.    begin
  162.       c:=Port.ReceiveChar;
  163.       case c of
  164.          #127:
  165.             GetEvent:=kbBack;
  166.          #33..#255:
  167.             GetEvent:=Byte(c);
  168.          #27:
  169.          begin
  170.             for W8i:=0 to EscTime do
  171.             begin
  172.                W8Timer:=Byte(Timer);
  173.                while (Byte(Timer)=W8Timer) and (not Port.CharAvail) do;
  174.             end;
  175.  
  176.             if Port.PreviewChar<>'[' then GetEvent:=kbEsc else
  177.             begin
  178.                Port.ReceiveChar;
  179.                c:=Port.ReceiveChar;
  180.                case c of
  181.                   'A'..'D':
  182.                      GetEvent:=ArrowKeys[c];
  183.                   else
  184.                      GoTo W8Key;
  185.                end;
  186.             end;
  187.          end;
  188.          #1..#32:
  189.             GetEvent:=Keys[c];
  190.          else
  191.             GoTo W8Key;
  192.       end;
  193.    end else GoTo W8Key;
  194. end;
  195.  
  196. procedure Abort;
  197. begin
  198.    asm
  199.       mov  si,word ptr Msg
  200.       cmp  byte ptr [si],1
  201.       je   @@NoClear
  202.       dec  si
  203.       mov  ah,0Fh
  204.       int  10h
  205.       cbw
  206.       int  10h
  207. @@NoClear:
  208.  
  209.       lea  dx,[si+1]
  210.       mov  ah,9
  211.       int  21h
  212.    end;
  213.    Halt(1);
  214. end;
  215.  
  216. procedure Init;
  217. var
  218.    PortNum, Error  :Word;
  219.    Timer           :Word absolute 0:$46C;
  220.    LTimer          :Word;
  221. begin
  222.    asm
  223.       mov  dx,word ptr CopyrightASCII
  224.       mov  ah,9
  225.       int  21h
  226.    end;
  227.  
  228.    Val(ParamStr(1), PortNum, Error);
  229.    if (Error<>0) or (PortNum>8) then
  230.       Abort(#1'Specify COM port number on the command line (1 to 8, 0 for local mode)'#13#10'$');
  231.    LocalMode:=(PortNum=0);
  232.    if not LocalMode then
  233.    begin
  234.       Port.Init(PortNum-1);
  235.       if not Port.Initialized then
  236.          Abort(#1'FOSSIL driver not installed'#13#10'$');
  237.  
  238.       Port.SendString(CopyrightANSI);
  239.  
  240.       LTimer:=Timer;
  241.       while (Timer>=LTimer) and (Timer-LTimer<18) do;
  242.  
  243.       SendCharANSI:=SendChar; CDANSI:=CD;
  244.       InitSendANSI;
  245.    end;
  246.  
  247.    LastExitProc:=ExitProc; ExitProc:=@PortExitProc;
  248. end;
  249.  
  250. begin
  251.    Init;
  252. end.
  253.